// DemandPartitioner.java
package com.taxi.analysis.demand;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

/**
 * 需求预测自定义分区器
 * 功能：根据时间、地理、需求类型进行智能分区
 * 技术：分区技术
 */
public class DemandPartitioner extends Partitioner<Text, Text> {

    @Override
    public int getPartition(Text key, Text value, int numPartitions) {

        String keyStr = key.toString();

        try {
            // 解析分区键格式: PARTITION_时间分区_地理分区_需求分区
            if (keyStr.startsWith("PARTITION_")) {
                String partitionInfo = keyStr.substring("PARTITION_".length());
                String[] parts = partitionInfo.split("_");

                if (parts.length >= 3) {
                    int timePartition = Integer.parseInt(parts[0]);
                    int geoPartition = Integer.parseInt(parts[1]);
                    int demandPartition = Integer.parseInt(parts[2]);

                    // 综合分区策略：时间权重40%，地理权重35%，需求类型权重25%
                    int partition = (timePartition * 40 + geoPartition * 35 + demandPartition * 25) % numPartitions;
                    return partition;
                }
            }

            // 其他类型的键使用不同的分区策略
            if (keyStr.startsWith("TIME_")) {
                // 时间分析键：按时间均匀分布
                return keyStr.hashCode() % numPartitions;
            } else if (keyStr.startsWith("GEO_")) {
                // 地理分析键：按地理位置分布
                return Math.abs(keyStr.hashCode()) % numPartitions;
            } else if (keyStr.startsWith("DEMAND_")) {
                // 需求分析键：按需求类型分布
                return Math.abs(keyStr.hashCode()) % numPartitions;
            }

        } catch (Exception e) {
            System.err.println("分区计算错误: " + keyStr);
        }

        // 默认分区策略
        return Math.abs(keyStr.hashCode()) % numPartitions;
    }
}
